# 有时候，使用临时变量能让代码更易读，而在其他时候，只会让代码无谓的边长
# 首先应该考虑的是，编写清晰易懂且能完成所需功能的代码，等到代码审核时，在需考虑采用更高效的方法

###4.3.3 对数值列表执行简单的统计计算
# 有几个Python函数可以帮助你处理数值列表。

### 轻松找出数值列表中的最大值。最小值和总和
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(min(digits))
print(max(digits))
print(sum(digits))

### 4.3.4 列表推导式
# 前面介绍的生成列表 squares 的方式包含 三四行代码，而列表推导式让你只需编写一行代码就能生成这样的列表

# 列表推导式，将 for循环 和 创建新元素的代码合成一行，并自动追加新元素。

# 示例使用列表推导式创建了前面的 平方数列表

squares = []
for value in range(1, 11):
      square = value ** 2
      squares.append(square)
      # 也可以直接  aquares.append(value ** 2)
print(squares)

squares = [value**2 for value in range(1, 11)]
print(squares)

# 使用 列表推导式， 首先指定一个描述性的列表名 （squares）
# 然后指定一个 左方括号，并定义一个表达式，用于生成要储存到列表中的值。 在这个实例中，表达式为 value**2，他计算平方值。
# 接下来，编写一个for循环， 用于给表达式提供值，在加上 右方括号。 在这个示例中，for循环为 for value in range(1, 11)，他将值1-10 提供给表达式 value**2，请注意，这个for循环语句末尾没有冒号

# 要创建列表推导式，需要一定量的练习，但能够熟练的创建常规列表后，你会发现这样做是完全值得的

### 动手试一试

### 练习4.3 数到20
for value in range(1, 21):
    print(value)

### 练习4.4 10万
numbers = list(range(1, 1_001))
print(numbers)
for value in range(1, 1_001):
    print(value)

### 练习4.5 100万求和
print(min(numbers))
print(max(numbers))
print(sum(numbers))

### 练习4.6 奇数
odd_numbers = list(range(1, 20, 2))
print(odd_numbers)

for value in range(1, 20, 2):
    print(value)

### 练习4.7 3的倍数
treble_numbers = list(range(3, 31, 3))
for value in range(3, 31, 3):
    print(value)

### 练习 4.8 立方
cube = []
for value in range(1, 11):
    cube.append(value**3)
    print(value**3)
print(cube)

### 练习 4.9 立方推导式
cube = [value**3 for value in range(1, 11)]
# 出错 cube = [cube for value in range(value**3)]
print(cube)

### 4.4 使用列表的一部分
### 4.4.1 切片

# 要创建切片，可指定要使用的第一个元素和最后一个元素的索引。
# 与range() 函数一样，Python 在到达指定的第二个索引之前的元素停止
# 要输出列表中的前三个元素，需要指定索引0 和 3，这样会返回索引分别为0、1和2 的元素

# 定义一个列表
players = ['charles', 'martina', 'michael', 'florence', 'eli']
print(players[0:3])

# 你可以生成列表的任意子集。例如；如果要提取列表的第二、第三和第四个元素、可将其实索引定为1，并将种植索引定为4
print(players[1:4])

# 如果内有指定第一个索引，Python将自动从列表开头开始
print(players[:4])

# 要让切片终止于列表末尾，也可使用类似的语法
print(players[1:])

# 无论列表多长，这种语法都能够让你输出从特定位置到列表末尾的所有元素。
# 上一章说过，负数索引返回与列表末尾有相应距离的元素，因此可以输出列表末尾的任意切片
# 如果要输出名单上最后三名队员的名字，可以使用切片 players[-3:]

# -1 代表列表最后一个元素
# # -2 代表列表倒数第二个元素

print(players[-3:]) # -3 元素到最后一个元素
print(players[-3:-1]) # 这个不包括最后一个元素

### 4.4.2 遍历切片
# 如果要遍历列表的部分元素，可在 for循环 中使用切片。
# 下面的示例遍历前三名队员，并打印他们的名字

players = ['charles', 'martina', 'michael', 'florence', 'eli']
print("Here are the first there players on my team:")
for player in players[:3]:
    print(player.title())

# 在很多情况下，切片是很有用的。

### 4.4.3 复制列表
# 你经常需要根据既有列表创建全新的列表。
# 要复制列表，可以创建一个包含整个列表的切片，方法是同时省略起始索引和终止索引
# 这让Python创建一个起始于第一个元素、终止于最后一个元素的切片，即复制整个列表

# 假设有一个有一个列表包含你最喜欢的四种食品，而你想在创建一个列表，并在其中包含你的一个朋友喜欢的所有食品
my_foods = ['pizza', 'falafel', 'carrot cake']
friend_foods = my_foods[:]

print('My favorite foods are:')
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)

# 为了核实确实有两个列表，下面在每个列表中都添加一种食品，并确认每个列表都记录了相应的人喜欢的食品

my_foods.append('cannoli')
friend_foods.append('ice cream')

print("My favorite foods are:")
print(my_foods)

print("\nMy friend's favorite foods are:")
print(friend_foods)

# 如果只是将 my_foods 赋值给 friend_foods，不能得到两个列表。

my_foods = ['pizza', 'falafel', 'carrot cake']

friend_foods = my_foods
# 这是行不通的，不能得到两个列表

### 动手试一试

### 练习4.10 切片
my_foods = ['pizza', 'falafel', 'carrot cake', '油麦菜', '红烧猪蹄', '甜甜的油闷大虾']

print("The first three items in the list are:")
for value in my_foods[:3]:
    print(value)

print('Three items from the middle of the list are:')
for value in my_foods[2:5]:
    print(value)

print("The last three items in the list are:")
for value in my_foods[-3:]:
    print(value)

### 练习4.11 你的比萨，我的比萨

my_pizza = ['KFC', 'Mcdonald', 'Domino', 'Pizza Hut']
friend_pizza = my_pizza[:]

my_pizza.append('华莱士')
friend_pizza.append('德克士')

print(my_pizza)
print(friend_pizza)

for value in friend_pizza[:]:
    print(value)





















































